package LeetCode;

public class ValidNumber
{
  //really ambiguos
  public static boolean isNumber(String s)
  {
    // Start typing your Java solution below
    // DO NOT write main() function
    try {
      double result = Double.parseDouble(s);
      System.out.println(result);
    }
    catch (Exception e) {
      return false;
    }
    
    return true;
  }
  
  
  enum InputType {
    INVALID,    // 0
    SPACE,      // 1
    SIGN,       // 2
    DIGIT,      // 3
    DOT,        // 4
    EXPONENT,   // 5
    NUM_INPUTS  // 6
};

  public static boolean isNumber1(String s)
  {

    int transitionTable[][] = { 
        { -1, 0, 3, 1, 2, -1 }, // next states for state 0
        { -1, 8, -1, 1, 4, 5 }, // next states for state 1
        { -1, -1, -1, 4, -1, -1 }, // next states for state 2
        { -1, -1, -1, 1, 2, -1 }, // next states for state 3
        { -1, 8, -1, 4, -1, 5 }, // next states for state 4
        { -1, -1, 6, 7, -1, -1 }, // next states for state 5
        { -1, -1, -1, 7, -1, -1 }, // next states for state 6
        { -1, 8, -1, 7, -1, -1 }, // next states for state 7
        { -1, 8, -1, -1, -1, -1 }, // next states for state 8
    };

    int state = 0;
    int i = 0;
    while (i < s.length()) {
      InputType inputType = InputType.INVALID;
      char c = s.charAt(i);
      if (c == ' ')
        inputType = InputType.SPACE;
      else if (c == '+' || c == '-')
        inputType = InputType.SIGN;
      else if (c >= '0' && c <= '9')
        inputType = InputType.DIGIT;
      else if (c == '.')
        inputType = InputType.DOT;
      else if (c == 'e' || c == 'E') inputType = InputType.EXPONENT;

      // Get next state from current state and input symbol
      state = transitionTable[state][inputType.ordinal()];

      // Invalid input
      if (state == -1)
        return false;
      else
        i++;
    }
    // If the current state belongs to one of the accepting (final) states,
    // then the number is valid
    return state == 1 || state == 4 || state == 7 || state == 8;
  }

  /**
   * @param args
   */
  public static void main(String[] args)
  {
    // TODO Auto-generated method stub
    System.out.println(isNumber1("0638D"));
  }

}
